﻿#define _CRT_SECURE_NO_WARNINGS  1
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//1.猜数字游戏
//		游戏要求：
//		1. 电脑⾃动⽣成1~100的随机数
		/*2. 玩家猜数字，猜数字的过程中，根据猜测数据的⼤⼩给出⼤了或⼩了的反馈，直到猜对，游戏结束*/
		/*void game() {
				int r = rand() % 100 + 1;
				int guess = 0;
				while (1)
				{
					printf("请猜数字>:");
					scanf("%d", &guess);
					if (guess < r)
					{
						printf("猜小了\n");
					}
					else if (guess > r)
					{
						printf("猜大了\n");
					}
					else
					{
						printf("恭喜你，猜对了\n");
						break;
					}
				}
			}
			void menu() {
				printf("***********************\n");
				printf("******  1. play  ******\n");
				printf("******  0. exit  ******\n");
				printf("***********************\n");
			}
			int main()
			{
				int input = 0;
				srand((unsigned int)time(NULL));
				do
				{
					menu();
					printf("请选择:>");
					scanf("%d", &input);
					switch (input)
					{
					case 1:
						game();
						break;
					case 0:
						printf("游戏结束\n");
						break;
					default:
						printf("选择错误，重新选择\n");
						break;
					}
				} while (input);
				return 0;
			}*/
//2.多个字符从两端移动，向中间汇聚
		/*int main()
		{
				char arr1[] = "welcome to bit...";
				char arr2[] = "#################";
				int left = 0;
				int right = strlen(arr1) - 1;
				printf("%s\n", arr2);
				while (left <= right)
				{
					Sleep(1000);
					arr2[left] = arr1[left];
					arr2[right] = arr1[right];
					left++;
					right--;
					printf("%s\n", arr2);
				}
				return 0;
		}*/
//3.//输⼊⼀个正的整数，逆序打印这个整数的每⼀位例如：
		/*输⼊：1234，输出：4321
		输⼊：521，输出：125*/
		/*int main()
		{
				int a = 0;
				scanf("%d", &a);
				while (a)
				{
					printf("%d ", a % 10);
					a = a / 10;
				}
				return 0;
		}*/
//4.//计算1~100之间3的倍数的数字之和
		/*int main()
		{
			int sum = 0;
			for (int a = 1; a<= 100; a++)
			{
				if (a % 3 == 0)
					sum += a;
				}
			printf("%d\n", sum);
			return 0;
		}*/
//5.二分查找
		/*⽐如我买了⼀双鞋，你好奇问我多少钱，我说不超过300元。你还是好奇，你想知道到底多少，我就让
		你猜，你会怎么猜？你会1，2，3，4...这样猜吗？显然很慢；⼀般你都会猜中间数字，⽐如：150，然
		后看⼤了还是⼩了，这就是⼆分查找，也叫折半查找。*/
		/*int main()
		{
			int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; 
			int left = 0;
			int right = sizeof(arr) / sizeof(arr[0]) - 1;
			int key = 7;//要找的数字 
			int mid = 0;//记录中间元素的下标 
			int find = 0;
			while (left <= right)
			{
				mid = (left + right) / 2; if (arr[mid] > key)
				{
					right = mid - 1;
				}
				else if (arr[mid] < key)
				{
					left = mid + 1;
				}
				else
				{
					find = 1; break;
				}
			}
			if (1 == find)
				printf("找到了,下标是%d\n", mid);
			else
				printf("找不到\n");}*/
//6计算某个数的平方根
		/*int main()
		{
			double a = 16.0;
			double b = sqrt(a);
			printf("%lf", b);
			return 0;
		}*/
//7.对strlen和size of的理解
		/*int main()
				{
					int len = strlen("abcdef\0");//1.strlen求⼀个字符串的⻓度
					printf("%d\n", len);//2.打印⻓度   
					return 0;
				}*/
				//结果为6
		/*int main()
				{
					int len = strlen("abcdef\n");//1.strlen求⼀个字符串的⻓度
					printf("%d\n", len);//2.打印⻓度
					return 0;
				}*/
				//结果为7
//8.static的用法
		//8.1	void test()
			/*{
				int i = 0;
				i++;
				printf("%d ", i);
			}
			int main()
			{
				int i = 0;
				for (i = 0; i < 5; i++)
				{
					test();
				} 
				return 0;
				}*/
		//8.2	void test() {
				//static修饰局部变量 
				/*static int i = 0;
				i++;
				printf("%d ", i);
			}
			int main()
			{
				int i = 0;
				for (i = 0; i < 5; i++)
				{
					test();
				}	
				return 0;
				}*/
//9.函数的递归
		//计算n的阶乘（不考虑溢出），n的阶乘就是1~n的数字累积相乘。
			/*int Fact(int n) 
			{
				if (n == 0) return 1; 
				else return n * Fact(n - 1);
			}
			int main() {
				int n = 0; 
				scanf("%d", &n);
				int ret = Fact(n);
				printf("%d\n", ret);
				return 0;
			}*/
//10.函数的递归——输⼊⼀个整数m，按照顺序打印整数的每⼀位。
//输⼊：1234输出：1234
//输⼊：520输出：520
			/*void Print(int n) 
			{
				if (n > 9)
				{
					Print(n / 10);
				} 
				printf("%d ", n % 10);
			}
			int main() 
			{
				int m = 0; 
				scanf("%d", &m);
				Print(m);
				return 0;
			}*/
			/*这段代码实现了一个递归函数 Print，用于打印一个整数 n 的每一位数字，从最低位开始（即个位、十位、百位等，直到最高位）。
			这种递归函数通常用于处理树结构或需要分解问题为更小子问题的场景，但在这个例子中，它被用来遍历整数的每一位。下面是代码的详细分析：
			函数 Print(int n)
				参数：接受一个整数 n 作为参数。
				功能：递归地打印整数 n 的每一位数字，从最低位到最高位。
				递归终止条件：当 n 小于或等于 9 时，递归结束。因为小于或等于 9 的整数只有一位，无需进一步递归分解。
				递归步骤：
				首先检查 n 是否大于 9。如果是，函数会调用自身 Print(n / 10)，即传入 n 除以 10 的结果。这一步是将 n 的最高位数字“移除”（实际上是通过除以 10 实现的），以便在递归调用中处理剩下的较低位数字。
				接着，使用 printf("%d ", n % 10); 打印 n 的当前最低位数字。n % 10 计算 n 除以 10 的余数，即 n 的个位数。
				函数 main()
				功能：程序的主入口点。
				流程：
				定义一个整数变量 m 并初始化为 0。
				使用 scanf("%d", &m); 从标准输入读取一个整数到变量 m 中。
				调用 Print(m); 函数，传入读取的整数 m。这将启动递归过程，最终打印出 m 的每一位数字，从最低位到最高位。
				程序返回 0，表示成功结束。
				示例
				假设输入为 1234，程序的工作流程如下：
				Print(1234) 被调用。
				1234 > 9，所以调用 Print(1234 / 10)，即 Print(123)。
				在 Print(123) 中，123 > 9，所以调用 Print(123 / 10)，即 Print(12)。
				在 Print(12) 中，12 > 9，所以调用 Print(12 / 10)，即 Print(1)。
				在 Print(1) 中，1 <= 9，递归终止。此时打印 1 % 10，即 1。
				返回到 Print(12)，打印 2 % 10，即 2。
				返回到 Print(123)，打印 3 % 10，即 3。
				返回到 Print(1234)，打印 4 % 10，即 4。
				因此，输出将是 4 3 2 1，即输入数字 1234 的每一位数字，从最低位到最高位。*/
//11.函数的递归，强化版：
	//求第n个斐波那契数
			/*int Fib(int n) 
			{
				if (n <= 2) return 1; 
				else return Fib(n - 1) + Fib(n - 2);
			}int main() 
			{
				int n = 0; 
				scanf("%d", &n);
				int ret = Fib(n);
				printf("%d\n", ret);
				return 0;
			}*/
//12.输入一个小写字母，输出其对应的大写字母。例如输入 q[回车] 时，会输出 Q
			//int main()
			//{
			//	char a = '\0', b;
			//	// 使用char类型来存储字符  
			//	scanf(" %c", &a); // 注意%c前的空格，用于消耗可能存在的换行符  

			//	// 检查输入是否为小写字母  
			//	if (a >= 'a' && a <= 'z') {
			//		b = a - 'a' + 'A'; // 更安全的转换方式，不依赖于ASCII码的具体差值  
			//		printf("%c\n", b);
			//	}
			//	else {
			//		printf("输入的不是小写字母!\n");
			//	}

			//	return 0;
			//}